Schulung, Beratung und Entwicklung

Glück IT

Gesellschaft für IT Beratung, Schulung und Entwicklung

NEWS

Content Management System ®CMAssist

TSQL Kill - Verbindungen trennen

Um offene Verbindungen zu einer Datenbank trennen zu können gibt es im TSQL den Befehl KILL.
Welche Prozesse gerade aktiv sind verrät die Systemtabelle MASTER..SysProcesses.

Folgende Prozesse sollten nicht beendet werden:

Spalte: cmd

  • AWAITING COMMAND
Hierbei handelt es sich um offene Verbindungen, beispielsweise des Microsoft SQL Server Management Studio.
Je nach dem was man gerade vorhat, müssen aber genau diese weg. Beispielsweise wenn die Datenbank gelöscht werden soll und das von aktiven Verbindungen unterbunden wird.
  • CHECKPOINT SLEEP
  • LAZY WRITER
  • LOCK MONITOR
  • SIGNAL HANDLER

Das folgende SQL listet alle Verbindungen auf dem SQL Server auf.
SELECT * FROM MASTER..SysProcesses
WHERE DBId = DB_ID(@DatabaseName)

Das folgende Skript listet alle Verbindungen zu einer Datenbank auf und gibt diese per PRINT aus. Mit dem Kill Befehl würden diese Prozesse beendet. Damit dies nicht aus versehen passiert ist der Befehl auskommentiert so das das Skript erst einmal gefahrlos ausprobiert werden kann.

DECLARE @DatabaseName nvarchar(50)
DECLARE @SPId int = -1

SET @DatabaseName = N´´

WHILE (NOT @SPId IS NULL)
BEGIN
SET @SPId = (SELECT TOP(1) SPId
FROM MASTER..SysProcesses
WHERE DBId = DB_ID(@DatabaseName) AND SPId <> @@SPId AND spid>@SPId
ORDER BY spid)

PRINT @SPId
-- KILL @SPId
END
GO

Als Procedure sieht das dann wie folgt aus:

CREATE PROCEDURE KillDBProccess(@DatabaseName nvarchar(50))
AS
-- EXECUTE AS { SELF | OWNER | ´user_name´ }
-- SELF ist der Ersteller der SP
-- OWNER ist der aktuelle Besitzer der SP
-- ´user_name´ ist irgend ein User
-- Immer daran denken das das Skript/die Prozedur im Kontext eines Users ablaufen muss der die Rechte hat!

DECLARE @SPId int = -1;
DECLARE @SQL varchar(max) = '';

WHILE (NOT @SPId IS NULL)
BEGIN
SET @SPId = (SELECT TOP(1) SPId
FROM MASTER..SysProcesses
WHERE DBId = DB_ID(@DatabaseName) AND SPId <> @@SPId AND spid>@SPId
ORDER BY spid)

PRINT @SPId
-- KILL @SPId /* Es könnte so einfach sein, leider erlaubt TSQL keine Variable im Kontext zu KILL daher:
SET @SQL = 'KILL ' + @SPId
EXEC (@SQL)

END

Schulung Microsoft SQL Server-Transact SQL Programmierung (TSQL) In dieser Schulung lernen Sie die Sprachelemente von Transact SQL kennen.

Schulung SQL - Die Datenbanksprache Diese Schulung vermittelt die Grundlagen von SQL und ist die Voraussetzung für die TSQL Schulung